#if !defined(___OS_WIN)
#error Invalid OS
#endif

/*====================== Time ===========================================*/

xx TimeWait(N4 tmm)
{ Sleep(tmm);
}

/*====================== Exec ===========================================*/

#define ___EXE

N4 MemExe(Ptr mem,N4 len)
{ return (0);
}

/*====================== Module =========================================*/

#define ___LIB

N4 LibOpen(Str nam)
{ N4 id;
  if (!nam) return (-1);
  id=(N4)LoadLibrary((CS)nam);
  if (!id) return (-1);
  return (id);
}

xx LibClose(N4 id)
{ if (id==-1) return;
  FreeLibrary((HMODULE)id);
}

Ptr AdrGet(N4 id,Str nam)
{ Ptr adr;
  if (!nam) return (NULL);
  adr=GetProcAddress((HMODULE)id,(CS)nam);
  return (adr);
}

xx AdrRel(N4 id,Ptr adr)
{
}

/*====================== Thread =========================================*/

#define ___THR
N1 isth=1;

N4 ThBeg(fFun fun,N4 par)
{ DWORD id;

  if (!fun) return (-1);
  if (!CreateThread(NULL,0,
    (LPTHREAD_START_ROUTINE)fun,(LPVOID)par,0,&id))
    return (-1);
  if (!id)
  { fputs("Error: ThBeg: Zero\n",err);
    SysExit(-1);
  }

  return ((N4)id);
}

xx ThEnd(N4 id)
{ if (id==-1) return;
  TerminateThread((HANDLE)id,0);
}

N4 ThId(xx)
{ return ((N4)GetCurrentThreadId());
}

N4 ThLkGet(xx)
{ N4 id;
  if (!(id=(N4)CreateMutex(NULL,FALSE,NULL)))
    return (-1); else return (id);
}

xx ThLkRel(N4 id)
{ if (id==-1) return;
  CloseHandle((HANDLE)id);
}

N4 ThLkBeg(N4 id)
{ DWORD ret=WaitForSingleObject((HANDLE)id,INFINITE);
  if (ret==WAIT_FAILED) return (-1);
  else return (0);
}

N4 ThLkEnd(N4 id)
{ if (!ReleaseMutex((HANDLE)id))
    return (-1); else return (0);
}

/*-----------------------------------------------------------------------*/

N4 ThEvtGet(xx)
{ N4 id;
  if (!(id=(N4)CreateEvent(NULL,FALSE,FALSE,NULL)))
    return (-1); else return (id);
}

xx ThEvtRel(N4 id)
{ if (id==-1) return;
  CloseHandle((HANDLE)id);
}

N4 ThEvtSet(N4 id)
{ if (!SetEvent((HANDLE)id))
    return (-1); else return (0);
}

N4 ThEvtNul(N4 id)
{ if (!ResetEvent((HANDLE)id))
    return (-1); else return (0);
}

xx ThEvtWait(N4 id,N4 lk,N4 tmm)
{ if (tmm==-1) tmm=INFINITE;
  ThLkEnd(lk);
  WaitForSingleObject((HANDLE)id,tmm);
  ThLkBeg(lk);
}

/*=======================================================================*/
